package com.scheduling.inventory.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.scheduling.inventory.dto.MaterialInventoryQueryDTO;
import com.scheduling.inventory.entity.MaterialInventory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 原料库存Mapper接口
 *
 * @author 开发团队
 * @since 2025-05-29
 */
@Mapper
public interface MaterialInventoryMapper extends BaseMapper<MaterialInventory> {

    /**
     * 分页查询原料库存（关联原料信息）
     *
     * @param page     分页参数
     * @param queryDTO 查询条件
     * @return 原料库存分页数据
     */
    IPage<MaterialInventory> selectPageWithMaterial(Page<MaterialInventory> page,
                                                    @Param("query") MaterialInventoryQueryDTO queryDTO);

    /**
     * 根据原料ID查询库存
     *
     * @param materialId 原料ID
     * @return 原料库存
     */
    MaterialInventory selectByMaterialId(@Param("materialId") String materialId);

    /**
     * 查询库存不足的原料列表
     *
     * @return 库存不足的原料库存列表
     */
    List<MaterialInventory> selectLowStockMaterials();

    /**
     * 批量更新库存数量
     *
     * @param inventoryList 库存列表
     * @return 更新数量
     */
    int batchUpdateQuantity(@Param("list") List<MaterialInventory> inventoryList);

    /**
     * 检查原料是否存在库存记录
     *
     * @param materialId 原料ID
     * @return 存在数量
     */
    int countByMaterialId(@Param("materialId") String materialId);

    /**
     * 根据原料名称模糊查询库存
     *
     * @param materialName 原料名称
     * @return 原料库存列表
     */
    List<MaterialInventory> selectByMaterialNameLike(@Param("materialName") String materialName);

    /**
     * 调整库存数量（增加或减少）
     *
     * @param materialId   原料ID
     * @param adjustAmount 调整数量（正数增加，负数减少）
     * @return 更新数量
     */
    int adjustQuantity(@Param("materialId") String materialId,
                       @Param("adjustAmount") java.math.BigDecimal adjustAmount);

    /**
     * 检查库存是否充足
     *
     * @param materialId       原料ID
     * @param requiredQuantity 所需数量
     * @return 是否充足
     */
    Boolean checkSufficientQuantity(@Param("materialId") String materialId,
                                    @Param("requiredQuantity") java.math.BigDecimal requiredQuantity);

    /**
     * 更新库存数量
     *
     * @param materialId 原料ID
     * @param quantity   新的库存数量
     * @return 更新数量
     */
    int updateQuantity(@Param("materialId") String materialId, @Param("quantity") java.math.BigDecimal quantity);

    /**
     * 增加库存数量
     *
     * @param materialId 原料ID
     * @param amount     增加数量
     * @return 更新数量
     */
    int increaseQuantity(@Param("materialId") String materialId, @Param("amount") java.math.BigDecimal amount);

    /**
     * 减少库存数量
     *
     * @param materialId 原料ID
     * @param amount     减少数量
     * @return 更新数量
     */
    int decreaseQuantity(@Param("materialId") String materialId, @Param("amount") java.math.BigDecimal amount);
} 